<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>原型继承方式</title>
	</head>
	<body>
		<script>
			//ES6之前并没有给我们提供extends继承，我们可以通过构造函数+原型对象模拟实现继承。
			// 继承属性，利用call改变this指向。但该方法只可以继承属性，实例不可以使用父类的方法。
			// function Father(name) {
			// 	this.name = name
			// }
			// Father.prototype.dance = function () {
			// 	console.log('我会跳舞')
			// }
			// function Son(name, age) {
			// 	Father.call(this, name)
			// 	this.age = age
			// }
			// let son = new Son('歌谣', 100)
			// son.dance() //报错

			// 解决方法1：利用Son.prototype = Father.prototype改变原型指向，但此时我们给子类增加原型方法，同样会影响到父类。
			// function Father(name) {
			// 	this.name = name
			// }
			// Father.prototype.dance = function () {
			// 	console.log('我会跳舞')
			// }
			// function Son(name, age) {
			// 	Father.call(this, name)
			// 	this.age = age
			// }
			// Son.prototype = Father.prototype
			// //为子类添加方法
			// Son.prototype.sing = function () {
			// 	console.log('我会唱歌')
			// }
			// let son = new Son('歌谣', 100)
			// //此时父类也被影响了
			// console.log(Father.prototype) //{dance: ƒ, sing: ƒ, constructor: ƒ}

			//解决方法2：子类的原型指向父类的实例，这样就可以顺着原型链共享父类的方法了。并且为子类添加原型方法的时候，不会影响父类。
			function Father(name) {
				this.name = name
			}
			Father.prototype.dance = function () {
				console.log('我会跳舞')
			}
			function Son(name, age) {
				Father.call(this, name)
				this.age = age
			}
			Son.prototype = new Father()
			Son.prototype.sing = function () {
				console.log('我会唱歌')
			}
			let son = new Son('歌谣', 100)
			console.log(Father.prototype) //{dance: ƒ, constructor: ƒ}
		</script>
	</body>
</html>
